//#include <string>
//#include <stdio.h>
//#include <stdlib.h>
//#include <ole2.h>
//#include <comdef.h>
//#include "VirtualBox.h"
//
//class EventListener
//{
//public:
//	EventListener()
//	{
//	}
//
//	virtual ~EventListener()
//	{
//	}
//
//	HRESULT init()
//	{
//		return S_OK;
//	}
//
//	void uninit()
//	{
//	}
//
//	STDMETHOD(HandleEvent)(VBoxEventType_T aType, IEvent *aEvent)
//	{
//		switch (aType)
//		{
//		case VBoxEventType_OnMachineRegistered:
//		{
//			IMachineRegisteredEvent *pEvent = static_cast<IMachineRegisteredEvent*> (aEvent);
//			//Assert(pEvent);
//
//			BSTR * uuid;
//			BOOL fRegistered;
//			HRESULT hr = pEvent->get_Registered(&fRegistered);
//			if (SUCCEEDED(hr))
//				hr = pEvent->get_MachineId(uuid);
//			if (SUCCEEDED(hr))
//			{
//
//			}
//			break;
//		}
//
//		case VBoxEventType_OnMachineStateChanged:
//		{
//			IMachineStateChangedEvent *pEvent = (IMachineStateChangedEvent*)(aEvent);
//
//			MachineState_T machineState;
//			Bstr uuid;
//
//			HRESULT hr = pEvent->COMGETTER(State)(&machineState);
//			if (SUCCEEDED(hr))
//				hr = pEvent->COMGETTER(MachineId)(uuid.asOutParam());
//
//			if (SUCCEEDED(hr))
//			{
//				int rc = RTCritSectEnter(&g_csMachines);
//				if (RT_SUCCESS(rc))
//				{
//					for (unsigned j = 0; j < RT_ELEMENTS(g_aModules); j++)
//						if (g_aModules[j].fEnabled)
//						{
//							int rc2 = g_aModules[j].pDesc->pfnOnMachineStateChanged(uuid,
//								machineState);
//							if (RT_FAILURE(rc2))
//								serviceLog("Module '%s' reported an error: %Rrc\n",
//								g_aModules[j].pDesc->pszName, rc);
//							/* Keep going. */
//						}
//
//					int rc2 = RTCritSectLeave(&g_csMachines);
//					if (RT_SUCCESS(rc))
//						rc = rc2;
//					AssertRC(rc);
//				}
//			}
//			break;
//		}
//
//		case VBoxEventType_OnVBoxSVCAvailabilityChanged:
//		{
//			ComPtr<IVBoxSVCAvailabilityChangedEvent> pVSACEv = aEvent;
//			Assert(pVSACEv);
//			BOOL fAvailable = FALSE;
//			pVSACEv->COMGETTER(Available)(&fAvailable);
//
//			/* First, notify all modules. */
//			for (unsigned j = 0; j < RT_ELEMENTS(g_aModules); j++)
//				if (g_aModules[j].fEnabled)
//				{
//					int rc2 = g_aModules[j].pDesc->pfnOnServiceStateChanged(RT_BOOL(fAvailable));
//					if (RT_FAILURE(rc2))
//						serviceLog("Module '%s' reported an error: %Rrc\n",
//						g_aModules[j].pDesc->pszName, rc2);
//					/* Keep going. */
//				}
//
//			/* Do global teardown/re-creation stuff. */
//			if (!fAvailable)
//			{
//				serviceLog("VBoxSVC became unavailable\n");
//				watchdogShutdown();
//			}
//			else
//			{
//				serviceLog("VBoxSVC became available\n");
//				int rc2 = watchdogSetup();
//				if (RT_FAILURE(rc2))
//					serviceLog("Unable to re-set up watchdog (rc=%Rrc)!\n", rc2);
//			}
//
//			break;
//		}
//
//		default:
//			/* Not handled event, just skip it. */
//			break;
//		}
//
//		return S_OK;
//	}
//
//private:
//};
//typedef ListenerImpl<VirtualBoxEventListener> VirtualBoxEventListenerImpl;
//VBOX_LISTENER_DECLARE(VirtualBoxEventListenerImpl)
